/* eslint-disable array-bracket-spacing */
'use strict'

const path = require('path')

/**
 * 默认的应用配置
 */

const { getLocalhost } = require('../app/extend/helper')

module.exports = app => {
  const config = {}

  /**
   * cookie 签名 token，建议修改
   */
  const key = '_1524674116001'
  config.keys = 'egg-js-admin' + key

  /**
   * 中间件配置
   */
  config.middleware = ['catchError', 'jwtVerify']

  // 静态资源路径
  config.static = {
    prefix: '/public/',
    dir: path.join(app.baseDir, 'public'),
    dynamic: true,
    preload: false,
    maxAge: 604800,
    buffer: true
  }

  /**
   * 数据库相关配置
   */
  config.sequelize = {
    // 全局配置
    define: {
      // 是否自动进行下划线转换（这里是因为 DB 默认的命名规则是下划线方式，而我们使用的大多数是驼峰方式）
      underscored: true,
      // 启用 sequelize 默认时间戳设置
      timestamps: true,
      // 禁用 sequelize 默认给表名设置复数
      freezeTableName: true
    },
    // 时区修正
    timezone: '+08:00',
    // 格式化返回的数据结构
    dialectOptions: {
      dateStrings: true,
      typeCast: true
    }
  }

  /**
   * 自定义的应用配置，修改后全局生效
   */
  // 接口前缀名称，跟随业务系统修改
  const apiPrefixName = 'api'
  // 接口完整前缀
  const apiPrefix = `/${apiPrefixName}`
  const userConfig = {
    // 应用名称，用于日志文件目录指定、cookie 的 key 指定，具有唯一性，默认是 app.name，也可以改成其他字符串
    appName: 'egg-js-admin',
    apiPrefixName,
    apiPrefix,
    // 默认的 code 码和错误提示信息配置，只需要改这一个地方即可
    resCode: {
      // 服务器异常的 code 标识和提示，一般都不需要改
      serverError: { code: 500, message: '服务器异常' },
      // 成功的 code 标识
      success: { code: 0 },
      // 出错的 code 标识和提示
      error: { code: 602, message: '参数异常' },
      // 出错的 code 标识和提示
      uniqueError: { code: 603, message: '参数已存在' },
      // 未登录的 code 标识和提示
      notLogged: { code: 601, message: '请先登录后再操作' }
    }
  }


  /**
   * cookie 配置
   */
  // 默认的 cookie 失效时间配置
  config.session = {
    key: `_${userConfig.appName}_${apiPrefixName}_`,
    // 7 天
    maxAge: 24 * 3600 * 1000 * 7,
    httpOnly: true,
    encrypt: true
  }

  /**
   * 安全策略配置
   */
  config.security = {
    // 关闭 CSRF 攻击防御（伪造用户请求向网站发起恶意请求）
    // csrf: {
    //   enable: false
    // }
  }
  // 设置白名单
  const port = 9001 // 前端端口，跟随实际情况修改
  const domainWhiteList = [
    ...new Set([
      `http://127.0.0.1:${port}`,
      `http://localhost:${port}`,
      // 服务启动时尝试自动获取本机 IP 设置白名单
      `http://${getLocalhost()}:${port}`
    ])
  ]
  config.security = { domainWhiteList }

  // 默认允许跨域，生产环境关闭此设置
  config.cors = {
    origin: '*',
    allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
  }

  /**
   * 权限配置
   */
  config.jwtVerify = {
    // 接口白名单配置
    whiteUrls: [
      `${apiPrefix}/v1/user/mock`,
      `${apiPrefix}/v1/user/wx_login`,
      `${apiPrefix}/v1/user/wx_logout`,
      `${apiPrefix}/v1/user/wx_phone`,
      `${apiPrefix}/v1/user/login`,
      `${apiPrefix}/v1/user/logout`,
      `${apiPrefix}/v1/place/auth`,
      `${apiPrefix}/v1/place/barcode`, // 根据barcode获取门店信息
      `${apiPrefix}/v1/place/version`,
      `${apiPrefix}/v1/appauth/list`,
      `${apiPrefix}/v1/member/online_list`, // 查询门店在线会员列表
      `${apiPrefix}/v1/desktopcfg/current`, // 获取门店当前应用的桌面配置
      `${apiPrefix}/v1/seat/get`, // 获取门店机位图
      `${apiPrefix}/v1/member/post_event` // 事件上报
      // `${apiPrefix}/v1/user/create`,
    ]
  }

  /**
 * 参数校验配置
 */
  config.validatePlus = {
    // 校验通过了始终返回 true，不通过返回 false
    resolveError(ctx, errors) {
      if (errors.length) {
        // 始终返回第一个错误
        ctx.body = {
          code: userConfig.resCode.error.code,
          message: errors[0].message
        }
      }
    }
  }

  /**
 * 自动生成文档配置
 * 文档地址：https://github.com/Yanshijie-EL/egg-swagger-doc/blob/master/config/config.default.js
 * swagger-ui.html
 */
  config.swaggerdoc = {
    dirScanner: './app/controller',
    basePath: apiPrefix,
    apiInfo: {
      title: '接口平台',
      description: `${userConfig.appName} 接口平台。`,
      version: '1.0.0'
    },
    schemes: ['http', 'https'],
    consumes: ['application/json'],
    produces: ['application/json'],
    securityDefinitions: {
      apiKey: {
        type: 'apiKey',
        name: 'apiKey',
        in: 'header'
      },
      userPass: {
        type: 'basic'
      }
    },
    enableSecurity: false, // 启用授权验证
    enableValidate: true, // 启用参数校验
    routerMap: true, // 自动生成的api文档不需要额外的路由控制
    enable: true
  }

  // 文件上传配置
  config.multipart = {
    fileSize: '10mb', // 限制文件大小
    fileExtensions: ['.svg', '.png', '.jpg', '.jpeg', '.gif', '.json'], // 限制文件类型
    baseDir: app.baseDir, // 文件上传的目录，默认是 app.baseDir
    mode: 'stream', // 模式设置为“流”
    fileModeMatch: /^\/file$/ // 匹配特定路径如"/file"以使用文件模式
  }

  /**
 * 小程序平台相关配置，可往下新增头条小程序、百度小程序、钉钉小程序等相关配置
 */
  // 微信小程序配置
  config.wechatApp = {
    appId: 'wx5c86c1ae9599a236',
    secret: '7212f7b04ae953c9c962a8c6911c1a5b'
  }

  // jwt secret配置
  config.jwt = {
    secret: '123_456_eggjs',
    expiresIn: 2 * 60 * 60
  }

  // 默认解密数据的KEY和IV
  config.aes = {
    isencrypt: true, // 是否启用授权数据加密
    key: 'xy2024@yisbar.com',
    iv: 'cqwskj@2024'
  }

  // 网吧服务上机、下机、换机、充值数据加密key和IV
  config.member = {
    isencrypt: true, // 是否启用授权数据加密
    key: 'xy2024@member',
    iv: 'member@2024'
  }

  /**
 * 阿里云短信配置
 */
  config.aliyunSms = {
    accessKeyId: '',
    accessKeySecret: '',
    signName: '',
    templateCode: ''
  }

  return {
    ...config,
    ...userConfig
  }
}


/**
 * 错误代码
 * 0 成功
 * 1001 异常错误
 * 1002 数据格式错误
 * 1003 重复
 * 1004 记录不存在
 * 1005 新增失败
 * 1006 修改失败
 * 1007 删除失败
 * 1008 查询失败
 *
 * 2001 过期
 * 2002 状态停用
 *
 */
